////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifedemux13.h
/// @brief camxifedemux13 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFEDEMUX13_H
#define CAMXIFEDEMUX13_H

// Camx includes
#include "camxformats.h"
#include "camxispiqmodule.h"
#include "camxsensorproperty.h"
#include "demux_1_3_0.h"
#include "titan170_ife.h"

// Common library includes
#include "iqcommondefs.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED
struct IFEDemux13RegCmd
{
    IFE_IFE_0_VFE_DEMUX_CFG          demuxConfig;     ///< Demux Config Register
    IFE_IFE_0_VFE_DEMUX_GAIN_0       demuxGain0;      ///< Demux Gain 0 Register
    IFE_IFE_0_VFE_DEMUX_GAIN_1       demuxGain1;      ///< Demux Gain 1 Register
    IFE_IFE_0_VFE_DEMUX_RIGHT_GAIN_0 demuxRightGain0; ///< Demux Right Plane Gain 0 Register
    IFE_IFE_0_VFE_DEMUX_RIGHT_GAIN_1 demuxRightGain1; ///< Demux Right Plane Gain 1 Register
    IFE_IFE_0_VFE_DEMUX_EVEN_CFG     demuxEvenConfig; ///< Defines the pattern for demuxpixeling even lines of the image
    IFE_IFE_0_VFE_DEMUX_ODD_CFG      demuxOddConfig;  ///< Defines the pattern for demuxpixeling odd lines of the image
} CAMX_PACKED;
CAMX_END_PACKED


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE Demux13 Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFEDemux13 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFEDemux13 Object
    ///
    /// @param  pCreateData Pointer to data for Demux Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Generate Settings for Demux13 Object
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetRegCmd
    ///
    /// @brief  Retrieve the buffer of the register value
    ///
    /// @return Pointer of the register buffer
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID* GetRegCmd();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFEDemux13
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFEDemux13();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFEDemux13
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFEDemux13();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return TRUE if dependencies met
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Interpolation and Calculation
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpRegConfig
    ///
    /// @brief  Print register configuration of Crop module for debug
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DumpRegConfig();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// InitRegValues
    ///
    /// @brief  Initialize registers with known set of values
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE VOID InitRegValues();

    IFEDemux13(const IFEDemux13&)            = delete;    ///< Disallow the copy constructor
    IFEDemux13& operator=(const IFEDemux13&) = delete;    ///< Disallow assignment operator

    Demux13InputData                    m_dependenceData; ///< Dependence Data for this module
    PixelFormat                         m_pixelFormat;    ///< pixel Format from the sensor
    IFEDemux13RegCmd                    m_regCmd;         ///< Register List of this module
    demux_1_3_0::chromatix_demux13Type* m_pChromatix;     ///< Pointer to tuning mode data
};

CAMX_NAMESPACE_END

#endif // CAMXIFEDEMUX13_H
